package com.xxxtea.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.xxxtea.common.BaseEnum;
import com.xxxtea.common.anno.AutowiredUserId;
import com.xxxtea.common.anno.DeserializeOnly;
import com.xxxtea.config.converter.BaseEnumDeserializer;
import com.xxxtea.mpe.annotation.Constraint;
import com.xxxtea.mpe.annotation.ExtendQuery;
import com.xxxtea.mpe.handler.AttachmentListHandler;
import com.xxxtea.mpe.model.Attachment;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;

import java.util.Date;
import java.util.List;

/**
 * 二手商品实体类
 * 
 * 用于存储二手商品的基本信息，包括：
 * - 商品基本信息（名称、描述、价格等）
 * - 商品图片管理
 * - 商品状态管理
 * - 卖家信息关联
 * - 分类信息关联
 * 
 * 使用MyBatis-Plus注解进行数据库映射
 * 使用Swagger注解进行API文档生成
 * 
 * @author badman
 * @since 1.0.0
 */
@Data
@ApiModel("旧物商品")
@TableName(autoResultMap = true)
public class SecondhandGoods {

	/**
	 * 主键ID
	 * 使用自增策略
	 */
	@ApiModelProperty("主键")
	@TableId(value = "id", type = IdType.AUTO)
	private Integer id;

	/**
	 * 商品分类ID
	 * 关联SecondhandCategory表
	 */
	@ApiModelProperty("分类ID")
	@Constraint(referenceClass = SecondhandCategory.class)
	private Integer categoryId;

	/**
	 * 卖家用户ID
	 * 自动注入当前用户ID
	 * 关联User表
	 */
	@ApiModelProperty("卖家ID")
	@AutowiredUserId
	@Constraint(referenceClass = User.class)
	private Integer sellerId;

	/**
	 * 商品名称
	 * 支持模糊查询
	 */
	@TableField(condition = SqlCondition.LIKE)
	@ApiModelProperty("商品名称")
	private String name;

	/**
	 * 商品主图
	 * 存储商品的主要展示图片
	 */
	@ApiModelProperty("商品主图")
	private Attachment image;

	/**
	 * 商品图片列表
	 * 使用自定义处理器处理附件列表
	 */
	@ApiModelProperty("商品图片")
	@TableField(typeHandler = AttachmentListHandler.class)
	private List<Attachment> images;

	/**
	 * 商品描述
	 * 商品的详细描述信息
	 */
	@ApiModelProperty("商品描述")
	private String description;

	/**
	 * 商品价格
	 * 商品的售价
	 */
	@ApiModelProperty("价格")
	private Double price;

	/**
	 * 联系方式
	 * 卖家的联系方式信息
	 */
	@ApiModelProperty("联系方式")
	private String contact;

	/**
	 * 商品状态
	 * 1-在售 2-已售
	 * 使用枚举类型管理状态
	 */
	@ApiModelProperty("状态 1-在售 2-已售")
	@JsonDeserialize(using = BaseEnumDeserializer.class)
	private Status status;

	/**
	 * 创建时间
	 * 自动填充插入时间
	 */
	@ApiModelProperty("创建时间")
	@TableField(fill = FieldFill.INSERT)
	private Date createTime;

	/**
	 * 更新时间
	 * 自动填充插入和更新时间
	 */
	@ApiModelProperty("更新时间")
	@TableField(fill = FieldFill.INSERT_UPDATE)
	private Date updateTime;

	/**
	 * 分类名称
	 * 扩展查询字段，关联分类表获取分类名称
	 */
	@ExtendQuery(referenceClass = SecondhandCategory.class, targetColumn = "name")
	private String categoryName;

	/**
	 * 卖家昵称
	 * 扩展查询字段，关联用户表获取卖家昵称
	 */
	@ExtendQuery(referenceClass = User.class, targetColumn = "nickname")
	private String sellerName;

	/**
	 * 最低价格
	 * 仅用于反序列化，查询条件
	 */
	@DeserializeOnly
	private Double minPrice;

	/**
	 * 最高价格
	 * 仅用于反序列化，查询条件
	 */
	@DeserializeOnly
	private Double maxPrice;

	/**
	 * 是否为我发布的商品
	 * 仅用于反序列化，查询条件
	 */
	@DeserializeOnly
	private Boolean publishedByMe;

	/**
	 * 状态列表
	 * 仅用于反序列化，查询条件
	 */
	@DeserializeOnly
	private List<Integer> statusList;

	/**
	 * 是否已收藏
	 * 非数据库字段，用于前端显示
	 */
	@TableField(exist = false)
	private boolean collect;

	/**
	 * 评价列表
	 * 非数据库字段，用于关联查询评价信息
	 */
	@TableField(exist = false)
	private List<Review> reviewList;

	/**
	 * 商品状态枚举
	 * 定义商品的各种状态
	 */
	@Getter
	@AllArgsConstructor
	public enum Status implements BaseEnum<Status> {
		/**
		 * 在售状态
		 */
		Status1(1, "在售"),
		/**
		 * 已售状态
		 */
		Status2(2, "已售"),
		;
		private final Integer value;
		private final String label;
	}
}